﻿//Provides functionality to select elements on the page based on a CSS selector.
Ext.DomQuery = {
    //选择一组元素。 
    //q : String  选择符 / xpath 查询（可以是以逗号分隔的选择符列表） 
    //root : Node  （可选）查询的起点（默认为：document）。 
    //返回值：Array  匹配选择符而形成的DOM元素数组，如果没有匹配的结果，返回一个空的数组
    select: function (q, root) {
        var results = [],
            nodes,
            i,
            j,
            qlen,
            nlen;

        root = root || document;
        if (typeof root == 'string') {
            root = document.getElementById(root);
        }

        q = q.split(",");
        for (i = 0, qlen = q.length; i < qlen; i++) {
            if (typeof q[i] == 'string') {
                //随着css selector engine在越来越多的javascript库中实现，进而影响了浏览器开发商，
                //在现代（除了ie）的浏览器中都实现了css selector api : querySelector,querySelectorAll ，
                //利用原生的 render engine ，速度得到了极大的提高，最终反馈到新的javascript库中，
                //在进行选择器筛选时都要首先进行能力检测(feature test)，适时地选择原生实现。 
                nodes = root.querySelectorAll(q[i]);

                for (j = 0, nlen = nodes.length; j < nlen; j++) {
                    results.push(nodes[j]);
                }
            }
        }

        return results;
    },

    //选择单个元素。 
    //selector : String  选择符 / xpath 查询 
    //root : Node  （可选）查询的起点（默认为：document）。 
    //返回值： Element  匹配的选择符的DOM元素The DOM element which matched the selector. 
    selectNode: function (q, root) {
        return Ext.DomQuery.select(q, root)[0];
    },

    //如果所给的元素与简易选择符相匹配，则返回 true（例如：div.some-class 或者 span:first-child） 
    //el : String/HTMLElement/Array  元素 ID、元素本身、或元素数组 
    //selector : String  测试用的简易选择符 
    //返回值：  Boolean 
    is: function (el, q) {
        if (typeof el == "string") {
            el = document.getElementById(el);
        }
        return Ext.DomQuery.select(q).indexOf(el) !== -1;
    }
};

Ext.Element.selectorFunction = Ext.DomQuery.select;
Ext.query = Ext.DomQuery.select;
